/* ===================

AX2E (AXESCON XACML 2.0 Engine) is the Java authorization engine, which implements OASIS XACML 2.0 standard.
Copyright (C) 2007 AXESCON LLC

This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.

This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Lesser General Public License for more details.

You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA


Contact: AXESCON LLC - info{at}axescon.com

 =================== */
/*
 * XML Type:  Policy
 * Namespace: urn:oasis:names:tc:xacml:2.0:policy:schema:os
 * Java type: axescon.xacml.model.policy.Policy
 *
 * Automatically generated - do not modify.
 */
package axescon.xacml.model.policy.impl;

import axescon.xacml.api.CtxHandler;
import axescon.xacml.api.PolicyEvaluator;
import axescon.xacml.api.XacmlException;
import axescon.xacml.model.ctx.Result;
import axescon.xacml.model.ctx.XacmlCtx;
import axescon.xacml.model.policy.Policy;
import axescon.xacml.model.policy.Rule;
import axescon.xacml.model.policy.RuleCombinerParameters;
import axescon.xacml.model.policy.VariableDefinition;

import java.util.TreeMap;

/**
 * An XML Policy(@urn:oasis:names:tc:xacml:2.0:policy:schema:os).
 * <p/>
 * This is a complex type.
 */
public class PolicyImpl extends PolicyObjectImpl implements Policy {

    private RuleCombinerParameters[] ruleCombinerParametersArray;

    public VariableDefinition[] getVariableDefinitionArray() {
        return (VariableDefinition[]) variableDefinitionMap.values().toArray(new VariableDefinition[variableDefinitionMap.size()]);
    }

    public VariableDefinition getVariableDefinition(String id) {
        if (variableDefinitionMap == null) return null;
        return (VariableDefinition) variableDefinitionMap.get(id);
    }

    public void setVariableDefinitionArray(VariableDefinition[] variableDefinitionArray) throws XacmlException {
        if (variableDefinitionArray == null || variableDefinitionArray.length == 0) {
            variableDefinitionMap = null;
            return;
        }
        variableDefinitionMap = new TreeMap();
        for (int i = 0; i < variableDefinitionArray.length; i++) {
            VariableDefinition vd = variableDefinitionArray[i];
            if (variableDefinitionMap.containsKey(vd.getVariableId()))
                throw new XacmlException("duplicate VariableDefinition:" + vd.getVariableId());
            variableDefinitionMap.put(vd.getVariableId(), vd);
        }
    }

    /**
     * guaranteed not to have duplicates
     * TreeMap<String, VariableDefinition>
     */
    private TreeMap variableDefinitionMap;

    private Rule[] ruleArray;

    private String ruleCombiningAlgId;


    public String getRuleCombiningAlgId() {
        return ruleCombiningAlgId;
    }

    public void setRuleCombiningAlgId(String ruleCombiningAlgId) {
        this.ruleCombiningAlgId = ruleCombiningAlgId;
    }


    public String toString() {
//        if(getRuleList()==null||getRuleList().size()<2)return "No output";
        return "*** PolicyImpl ::: id: " + getId()
                + "\n descr: " + getDescription()
                + "\n RuleCombiningAlgId: " + getRuleCombiningAlgId()
                + "\n # of Rules: " + (getRuleArray() == null ? 0 : getRuleArray().length)

                + (getCombinerParametersArray() == null ? "" :
                "\n # of CombinerParameters: " + (getCombinerParametersArray() == null ? 0 : getCombinerParametersArray().length))
                + "\n Defaults: " + getDefaults()
                + (getObligationArray() == null ? "" :
                "\n # of Obligations: " + (getObligationArray() == null ? 0 : getObligationArray().length))
                + "\n # of Rules: " + (getRuleArray() == null ? 0 : getRuleArray().length)
                + (getRuleCombinerParametersArray() == null ? "" :

                "\n # of RuleCombinerParameters: " + (getRuleCombinerParametersArray() == null ? 0 : getRuleCombinerParametersArray().length))
                + "\n # of VariableDefinitions: " + (getVariableDefinitionArray() == null ? 0 : getVariableDefinitionArray().length)
                + "\n Version: " + getVersion()
                + "\n Target: " + getTarget()
                ;
    }

    public Rule[] getRuleArray() {
        return ruleArray;
    }

    public void setRuleArray(Rule[] ruleArray) {
        this.ruleArray = ruleArray;
    }

    public RuleCombinerParameters[] getRuleCombinerParametersArray() {
        return ruleCombinerParametersArray;
    }

    public void setRuleCombinerParametersArray(RuleCombinerParameters[] ruleCombinerParametersArray) {
        this.ruleCombinerParametersArray = ruleCombinerParametersArray;
    }

    public Result evalMatched(PolicyEvaluator pe, XacmlCtx req, CtxHandler ch) throws XacmlException {
        return pe.evalMatched(this, req, ch);
    }

    public Result eval(PolicyEvaluator pe, XacmlCtx req, CtxHandler ch) throws XacmlException {
        return pe.evalMatched(this, req, ch);
    }

    public void validate(PolicyEvaluator pe) throws XacmlException{
        pe.validate(this);
    }

}
